package com.qufenqi.pay.abs.common.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * bean的拷贝工具 实现步骤： 1.获取两个对象的类信息 2.获取源对象的所有私有属性名称 3.根据源对象的属性名查找目标对象中是否有同名属性
 * 4.没有同名属性就结束本次匹配，进入到下一个属性的查找 5.有同名属性并且两个属性类型也相同的情况下再做以下操作
 * 6.构建该属性的get方法，调用，获取属性值 7.构建目标对象中该属性的set方法，调用，将值赋进去即可 补充方法： 1.获取对象指定属性的值
 * 2.为对象指定属性赋值 3.调用对象的某方法并返回调用结果 4.调用无返回值方法返回是否调用成功
 */
public class BeanUtil {
	public static void copyProperties(Object source, Object target) {
		try {
			Class sourceType = source.getClass();
			Class targetType = target.getClass();
			Field[] fields = sourceType.getDeclaredFields();
			for (Field f : fields) {
				String fieldName = f.getName();
				Field targetField = null;
				try {
					targetField = targetType.getDeclaredField(fieldName);
				} catch (SecurityException e) {
					break;
				} catch (NoSuchFieldException e) {
					continue;
				}
				// 开始处理找到的属性赋值
				// 先从源对象中调用该属性的get方法得到属性值
				// 需要构建该属性的get，set方法名
				if (f.getType() == targetField.getType()) {
					String getMethodName = "get"
							+ fieldName.substring(0, 1).toUpperCase()
							+ fieldName.substring(1);
					String setMethodName = "set"
							+ fieldName.substring(0, 1).toUpperCase()
							+ fieldName.substring(1);
					// 构造get、set方法的对象，并调用
					Method getMethod = sourceType.getMethod(getMethodName,
							new Class[] {});
					Method setMethod = targetType.getMethod(setMethodName,
							f.getType());
					// 先调用get方法获取源对象的属性值
					Object result = getMethod.invoke(source, new Object[] {});
					// 再调用set方法为目标对象赋值
					setMethod.invoke(target, result);
				}
			}
		} catch (Exception e) {
		}
	}

	public static Object getFieldValue(Object obj, String fieldName) {
		Object result = null;
		try {
			Class typeInfo = obj.getClass();
			Field field = typeInfo.getDeclaredField(fieldName);
			field.setAccessible(true);
			result = field.get(obj);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return result;
	}

	public static void setFieldValue(Object obj, String fieldName, Object value) {
	}

	public static Object invokeMethod(Object obj, String methodName,
			Object[] params) {
		return null;
	}

	public static boolean invokeNoReturnMethod(Object obj, String methodName,
			Object[] params) {
		return false;
	}

	public static void main(String[] args) {
		// BeanBase obj1 = new BeanBase(1,"xx",100);
		// BeanBase obj2 = new BeanBase();
		// try {
		// BeanUtil.copyProperties(obj1, obj2);
		// } catch (Exception e) {
		// e.printStackTrace();
		// }
		// System.out.println(obj2.getId() + " " +obj2.getName() + " " +
		// obj2.getScore() );
	}
}
